import cn.hutool.core.io.FileUtil
import cn.hutool.core.io.resource.ResourceUtil
import cn.hutool.extra.template.TemplateConfig
import cn.hutool.extra.template.TemplateUtil
import cn.hutool.poi.excel.ExcelUtil
import tuple.Tuple3
import java.io.File
import java.lang.RuntimeException
import java.util.*


/**
 *
 * @author eli.hou
 * @date 2020-08-21 22:01
 */
class Application {
    companion object {

        //项目路径
        private val APP_PATH: String = System.getProperty("user.dir")
        //项目分隔符
        private val PATH_SEPARATOR: String = File.separator
        //要输出的Word文件夹的名称
        private const val EXPORT_WORD_FOLDER_NAME = "export"
        //Excel文件中的列作为Word的文件名后缀
        private var EXPORT_WORD_FILE_SUFFIX = "基站名称"



        /**
         * 应用入口
         * 需要一个个参数：  需要作为新Word文件的后缀名
         */
        @JvmStatic
        fun main(args: Array<String>) {
            println("########## 任务开始 ###########")
            val startTime = Calendar.getInstance().timeInMillis

            val excelNameAndXmlName = this.getExcelNameAndXmlName()
            if (excelNameAndXmlName == null) {
                println("########## 任务未完成，请确保当前Jar包的同级目录下有Excel的源文件和Xml形式的Word模版文件 ###########")
                return
            }
            //指定要生成的Word文件后缀根据Excel的哪一列
            if (args.isNotEmpty()){
                EXPORT_WORD_FILE_SUFFIX = args[0]
            }

            //读取Excel(由于数据量不大，则不采用Sax流的方式读取)
            val reader = ExcelUtil.getReader(ResourceUtil.getStream(excelNameAndXmlName.item3 + excelNameAndXmlName.item1))
            val excelData = reader.readAll()

            //使用模版引擎解析xml
            val templateEngine = TemplateUtil.createEngine(TemplateConfig(excelNameAndXmlName.item3, TemplateConfig.ResourceMode.FILE))
            try {
                excelData.forEach {
                    println("正在解析的数据: [$it]")
                    val template = templateEngine.getTemplate(PATH_SEPARATOR + excelNameAndXmlName.item2)
                    val result = template.render(it)
                    //最终的xml形式的Word文件的全路径
                    val xmlName = excelNameAndXmlName.item1.split(".")[0]

                    //判断EXPORT_WORD_FILE_SUFFIX在Excel中是否存在
                    it[EXPORT_WORD_FILE_SUFFIX] ?:
                        throw RuntimeException("########## 任务未完成，请确保设置的Word后缀名在Excel中存在 ###########")

                    val filePath = "${excelNameAndXmlName.item3}$EXPORT_WORD_FOLDER_NAME$PATH_SEPARATOR$xmlName(${it[EXPORT_WORD_FILE_SUFFIX]}).docx"
                    //把解析的文件写出
//                println("解析后的文本：$result")
                    FileUtil.writeUtf8String(result, filePath)
                }
            }catch (e: RuntimeException){
                println(e.message)
            }

            val endTime = Calendar.getInstance().timeInMillis
            println("########## 任务完成,总共耗时：${endTime - startTime} 毫秒 ###########")
        }

        /**
         * 获取当前Jar包下的Excel文件名称和Xml文件名称
         * Tuple2<ExcelName, XmlName, 项目的根目录>
         */
        private fun getExcelNameAndXmlName(): Tuple3<String, String, String>? {
            val root = APP_PATH + PATH_SEPARATOR
            val file = File(root)

            var excelName = ""
            var xmlName = ""

            file.list()?.forEach {
                val hasExcel = it.endsWith("XLS") || it.endsWith("XLSX") || it.endsWith("xls") || it.endsWith("xlsx")
                if (hasExcel) excelName = it

                val hasXml = it.endsWith("XML") || it.endsWith("xml")
                if (hasXml) xmlName = it
            }
            if (excelName.isBlank() || xmlName.isBlank()) return null

            return Tuple3(excelName, xmlName, root)
        }
    }
}